在這一章中,我們將介紹 EVM 中的比較和位元邏輯指令,包括 LT、GT、SLT、SGT、EQ、ISZERO、AND、OR、XOR、NOT、BYTE、SHL、SHR 和 SAR。
#
# Comparison and Bitwise Logic
#
LT = 0x10
GT = 0x11
SLT = 0x12
SGT = 0x13
EQ = 0x14
ISZERO = 0x15
AND = 0x16
OR = 0x17
XOR = 0x18
NOT = 0x19
BYTE = 0x1A
SHL = 0x1B
SHR = 0x1C
SAR = 0x1D
比較指令用於比較兩個數的大小或相等性。
LT 指令:如果第二個數小於第一個數,則將 1 推送到堆疊,否則推送 0。
def lt(self):
value1 = self.evm.stack.pop()
value2 = self.evm.stack.pop()
result = 1 if value2 < value1 else 0
self.evm.stack.append(result)
GT 指令:如果第二個數大於第一個數,則將 1 推送到堆疊,否則推送 0。
def gt(self):
value1 = self.evm.stack.pop()
value2 = self.evm.stack.pop()
result = 1 if value2 > value1 else 0
self.evm.stack.append(result)
SLT 指令:有符號比較,如果第二個數(當作有符號整數)小於第一個數,則將 1 推送到堆疊,否則推送 0。
def slt(self):
value1 = int(self.evm.stack.pop())
value2 = int(self.evm.stack.pop())
result = 1 if value2 < value1 else 0
self.evm.stack.append(result)
SGT 指令:有符號比較,如果第二個數(當作有符號整數)大於第一個數,則將 1 推送到堆疊,否則推送 0。
def sgt(self):
value1 = int(self.evm.stack.pop())
value2 = int(self.evm.stack.pop())
result = 1 if value2 > value1 else 0
self.evm.stack.append(result)
EQ 指令:如果兩個數相等,則將 1 推送到堆疊,否則推送 0。
def eq(self):
value1 = self.evm.stack.pop()
value2 = self.evm.stack.pop()
result = 1 if value2 == value1 else 0
self.evm.stack.append(result)
位元邏輯指令包括 AND、OR、XOR、NOT、BYTE、SHL、SHR 和 SAR。這些指令執行位元邏輯操作。
AND 指令:對兩個數的位元進行 AND 運算。
def and_(self):
value1 = self.evm.stack.pop()
value2 = self.evm.stack.pop()
result = value1 & value2
self.evm.stack.append(result)
OR 指令:對兩個數的位元進行 OR 運算。
def or_(self):
value1 = self.evm.stack.pop()
value2 = self.evm.stack.pop()
result = value1 | value2
self.evm.stack.append(result)
XOR 指令:對兩個數的位元進行 XOR 運算。
def xor(self):
value1 = self.evm.stack.pop()
value2 = self.evm.stack.pop()
result = value1 ^ value2
self.evm.stack.append(result)
NOT 指令:對數進行位元 NOT 運算。
def not_(self):
value = self.evm.stack.pop()
result = ~value
self.evm.stack.append(result)
SHL 指令:將數值左移指定的位數。
def shl(self):
shift_amount = self.evm.stack.pop()
value = self.evm.stack.pop()
result = value << shift_amount
self.evm.stack.append(result)
SHR 指令:將數值右移指定的位數。
def shr(self):
shift_amount = self.evm.stack.pop()
value = self.evm.stack.pop()
result = value >> shift_amount
self.evm.stack.append(result)
SAR 指令:算術右移,與 SHR 類似,但保留符號位。
(注意:Python 的右移操作是算術右移,所以 SHR 和 SAR 的實現在 Python 中是相同的。但在其他語言或平台上,這兩者可能有所不同。)
def sar(self):
shift_amount = self.evm.stack.pop()
value = self.evm.stack.pop()
result = value >> shift_amount
self.evm.stack.append(result)
BYTE 指令:從一個字中提取特定位元範圍的值。
def byte(self):
position = self.evm.stack.pop()
value = self.evm.stack.pop()
mask = 0xFF << (8 * position)
result = (value & mask) >> (8 * position)
self.evm.stack.append(result)
ISZERO 指令:檢查數值是否為零。如果是,則將 1 推送到堆疊,否則推送 0。
def iszero(self):
value = self.evm.stack.pop()
result = 1 if value == 0 else 0
self.evm.stack.append(result)
在這一章中,我們介紹了 EVM 比較和位元邏輯指令,包括 LT、GT、SLT、SGT、EQ、ISZERO、AND、OR、XOR、NOT、BYTE、SHL、SHR 和 SAR。這些指令執行比較和位元邏輯操作,可以用於各種運算。接下來,我們將繼續擴充你的 EVM 功能,如果有任何疑問,請隨時提問!